home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / terms / tipx / xfer / zcommon.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-10-11  |  15.5 KB  |  503 lines

  1. /*+-------------------------------------------------------------------------
  2.     zcommon.c -  tiprz/tipsz common code
  3.     derived from public domain code by Chuck Forsberg
  4.     tip adaptation by wht%n4hgf@emory.mathcs.emory.edu
  5.  
  6.   Defined functions:
  7.     cancel_transaction(0)
  8.     get_curr_dir(currdir,currdir_max)
  9.     get_home_dir(home_dir)
  10.     getspeed(code)
  11.     mode(new_mode)
  12.     rdchk(f)
  13.     rdchk(f)
  14.     sendbrk()
  15.     zmputs(str)
  16.  
  17. --------------------------------------------------------------------------*/
  18. /*+:EDITS:*/
  19. /*:08-23-1990-13:48-wht@tridom-add mode 4 code */
  20. /*:05-21-1990-16:00-wht@tridom-adapt ecu xfer protocols for tipwht */
  21.  
  22. #include <stdio.h>
  23. #include <signal.h>
  24. #include <setjmp.h>
  25. #include <ctype.h>
  26. #include <pwd.h>
  27. #include "zmodem.h"
  28.  
  29. extern unsigned char vmin_count;
  30. extern int Zmodem;
  31. extern unsigned Baudrate;
  32. extern int Twostop;        /* Use two stop bits */
  33.  
  34. #if defined(LLITOUT)
  35. long Locmode;        /* Saved "local mode" for 4.x BSD "new driver" */
  36. long Locbit = LLITOUT;    /* Bit SUPPOSED to disable output translations */
  37. #endif
  38.  
  39. struct 
  40. {
  41.     unsigned baudr;
  42.     int speedcode;
  43. } speeds[] = 
  44. {
  45.     110,    B110,
  46.     300,    B300,
  47.     600,    B600,
  48.     1200,    B1200,
  49.     2400,    B2400,
  50.     4800,    B4800,
  51.     9600,    B9600,
  52.     19200,    EXTA,
  53.     38400,    EXTB,
  54.     0,
  55. };
  56.  
  57. /* crctab calculated by Mark G. Mendel,Network Systems Corporation */
  58. unsigned short crctab[256] = 
  59. {
  60.     0x0000,0x1021,0x2042,0x3063,0x4084,0x50a5,0x60c6,0x70e7,
  61.     0x8108,0x9129,0xa14a,0xb16b,0xc18c,0xd1ad,0xe1ce,0xf1ef,
  62.     0x1231,0x0210,0x3273,0x2252,0x52b5,0x4294,0x72f7,0x62d6,
  63.     0x9339,0x8318,0xb37b,0xa35a,0xd3bd,0xc39c,0xf3ff,0xe3de,
  64.     0x2462,0x3443,0x0420,0x1401,0x64e6,0x74c7,0x44a4,0x5485,
  65.     0xa56a,0xb54b,0x8528,0x9509,0xe5ee,0xf5cf,0xc5ac,0xd58d,
  66.     0x3653,0x2672,0x1611,0x0630,0x76d7,0x66f6,0x5695,0x46b4,
  67.     0xb75b,0xa77a,0x9719,0x8738,0xf7df,0xe7fe,0xd79d,0xc7bc,
  68.     0x48c4,0x58e5,0x6886,0x78a7,0x0840,0x1861,0x2802,0x3823,
  69.     0xc9cc,0xd9ed,0xe98e,0xf9af,0x8948,0x9969,0xa90a,0xb92b,
  70.     0x5af5,0x4ad4,0x7ab7,0x6a96,0x1a71,0x0a50,0x3a33,0x2a12,
  71.     0xdbfd,0xcbdc,0xfbbf,0xeb9e,0x9b79,0x8b58,0xbb3b,0xab1a,
  72.     0x6ca6,0x7c87,0x4ce4,0x5cc5,0x2c22,0x3c03,0x0c60,0x1c41,
  73.     0xedae,0xfd8f,0xcdec,0xddcd,0xad2a,0xbd0b,0x8d68,0x9d49,
  74.     0x7e97,0x6eb6,0x5ed5,0x4ef4,0x3e13,0x2e32,0x1e51,0x0e70,
  75.     0xff9f,0xefbe,0xdfdd,0xcffc,0xbf1b,0xaf3a,0x9f59,0x8f78,
  76.     0x9188,0x81a9,0xb1ca,0xa1eb,0xd10c,0xc12d,0xf14e,0xe16f,
  77.     0x1080,0x00a1,0x30c2,0x20e3,0x5004,0x4025,0x7046,0x6067,
  78.     0x83b9,0x9398,0xa3fb,0xb3da,0xc33d,0xd31c,0xe37f,0xf35e,
  79.     0x02b1,0x1290,0x22f3,0x32d2,0x4235,0x5214,0x6277,0x7256,
  80.     0xb5ea,0xa5cb,0x95a8,0x8589,0xf56e,0xe54f,0xd52c,0xc50d,
  81.     0x34e2,0x24c3,0x14a0,0x0481,0x7466,0x6447,0x5424,0x4405,
  82.     0xa7db,0xb7fa,0x8799,0x97b8,0xe75f,0xf77e,0xc71d,0xd73c,
  83.     0x26d3,0x36f2,0x0691,0x16b0,0x6657,0x7676,0x4615,0x5634,
  84.     0xd94c,0xc96d,0xf90e,0xe92f,0x99c8,0x89e9,0xb98a,0xa9ab,
  85.     0x5844,0x4865,0x7806,0x6827,0x18c0,0x08e1,0x3882,0x28a3,
  86.     0xcb7d,0xdb5c,0xeb3f,0xfb1e,0x8bf9,0x9bd8,0xabbb,0xbb9a,
  87.     0x4a75,0x5a54,0x6a37,0x7a16,0x0af1,0x1ad0,0x2ab3,0x3a92,
  88.     0xfd2e,0xed0f,0xdd6c,0xcd4d,0xbdaa,0xad8b,0x9de8,0x8dc9,
  89.     0x7c26,0x6c07,0x5c64,0x4c45,0x3ca2,0x2c83,0x1ce0,0x0cc1,
  90.     0xef1f,0xff3e,0xcf5d,0xdf7c,0xaf9b,0xbfba,0x8fd9,0x9ff8,
  91.     0x6e17,0x7e36,0x4e55,0x5e74,0x2e93,0x3eb2,0x0ed1,0x1ef0
  92. };
  93.  
  94. #if defined(WANT_UPDCRC_HERE)    /* wht -- moved to zmodem.h */
  95. /*
  96.  * updcrc macro derived from article Copyright (C) 1986 Stephen Satchell. 
  97.  *  NOTE: First srgument must be in range 0 to 255.
  98.  *        Second argument is referenced twice.
  99.  * 
  100.  * Programmers may incorporate any or all code into their programs,
  101.  * giving proper credit within the source. Publication of the 
  102.  * source routines is permitted so long as proper credit is given 
  103.  * to Stephen Satchell, Satchell Evaluations and Chuck Forsberg,
  104.  * Omen Technology.
  105.  */
  106.  
  107. #define updcrc(cp,crc) ( crctab[((crc >> 8) & 255)] ^ (crc << 8) ^ cp)
  108. #endif
  109.  
  110. /*
  111.   First,the polynomial itself and its table of feedback terms.  The
  112.   polynomial is:
  113.  
  114.   X^32+X^26+X^23+X^22+X^16+X^12+X^11+X^10+X^8+X^7+X^5+X^4+X^2+X^1+X^0
  115.  
  116.   Note that we take it "backwards" and put the highest-order term in the
  117.   lowest-order bit.  The X^32 term is "implied"; the LSB is the X^31
  118.   term,etc.  The X^0 term (usually shown as "+1") results in the MSB being
  119.   1.  Note that the usual hardware shift register implementation,which is
  120.   what we're using (we're merely optimizing it by doing eight-bit chunks at
  121.   a time) shifts bits into the lowest-order term.  In our
  122.   implementation,that means shifting towards the right.  Why do we do it
  123.   this way?  Because the calculated CRC must be transmitted in order from
  124.   highest-order term to lowest-order term.  UARTs transmit characters in
  125.   order from LSB to MSB.  By storing the CRC this way, we hand it to the
  126.   UART in the order low-byte to high-byte; the UART sends each low-bit to
  127.   hight-bit; and the result is transmission bit by bit from highest- to
  128.   lowest-order term without requiring any bit shuffling on our part.
  129.   Reception works similarly.
  130.  
  131.   The feedback terms table consists of 256 32-bit entries.  Notes:   
  132.  
  133.      The macro for using the table is UPDC32 is located in zmodem.h
  134.                                                                      
  135.      It might not be obvious,but the feedback terms simply represent the
  136.      results of eight shift/xor opera- tions for all combinations of data
  137.      and CRC register values.
  138.                                                                      
  139.      The values must be right-shifted by eight bits by the "UPDC32" logic;
  140.      the shift must be unsigned (bring in zeroes).  On some hardware you
  141.      could probably optimize the shift in assembler by using byte-swap
  142.      instructions.
  143. */
  144.  
  145. long cr3tab[] =        /* CRC polynomial 0xedb88320 */
  146. {
  147.     0x00000000,0x77073096,0xee0e612c,0x990951ba,0x076dc419,0x706af48f,0xe963a535,0x9e6495a3,
  148.     0x0edb8832,0x79dcb8a4,0xe0d5e91e,0x97d2d988,0x09b64c2b,0x7eb17cbd,0xe7b82d07,0x90bf1d91,
  149.     0x1db71064,0x6ab020f2,0xf3b97148,0x84be41de,0x1adad47d,0x6ddde4eb,0xf4d4b551,0x83d385c7,
  150.     0x136c9856,0x646ba8c0,0xfd62f97a,0x8a65c9ec,0x14015c4f,0x63066cd9,0xfa0f3d63,0x8d080df5,
  151.     0x3b6e20c8,0x4c69105e,0xd56041e4,0xa2677172,0x3c03e4d1,0x4b04d447,0xd20d85fd,0xa50ab56b,
  152.     0x35b5a8fa,0x42b2986c,0xdbbbc9d6,0xacbcf940,0x32d86ce3,0x45df5c75,0xdcd60dcf,0xabd13d59,
  153.     0x26d930ac,0x51de003a,0xc8d75180,0xbfd06116,0x21b4f4b5,0x56b3c423,0xcfba9599,0xb8bda50f,
  154.     0x2802b89e,0x5f058808,0xc60cd9b2,0xb10be924,0x2f6f7c87,0x58684c11,0xc1611dab,0xb6662d3d,
  155.     0x76dc4190,0x01db7106,0x98d220bc,0xefd5102a,0x71b18589,0x06b6b51f,0x9fbfe4a5,0xe8b8d433,
  156.     0x7807c9a2,0x0f00f934,0x9609a88e,0xe10e9818,0x7f6a0dbb,0x086d3d2d,0x91646c97,0xe6635c01,
  157.     0x6b6b51f4,0x1c6c6162,0x856530d8,0xf262004e,0x6c0695ed,0x1b01a57b,0x8208f4c1,0xf50fc457,
  158.     0x65b0d9c6,0x12b7e950,0x8bbeb8ea,0xfcb9887c,0x62dd1ddf,0x15da2d49,0x8cd37cf3,0xfbd44c65,
  159.     0x4db26158,0x3ab551ce,0xa3bc0074,0xd4bb30e2,0x4adfa541,0x3dd895d7,0xa4d1c46d,0xd3d6f4fb,
  160.     0x4369e96a,0x346ed9fc,0xad678846,0xda60b8d0,0x44042d73,0x33031de5,0xaa0a4c5f,0xdd0d7cc9,
  161.     0x5005713c,0x270241aa,0xbe0b1010,0xc90c2086,0x5768b525,0x206f85b3,0xb966d409,0xce61e49f,
  162.     0x5edef90e,0x29d9c998,0xb0d09822,0xc7d7a8b4,0x59b33d17,0x2eb40d81,0xb7bd5c3b,0xc0ba6cad,
  163.     0xedb88320,0x9abfb3b6,0x03b6e20c,0x74b1d29a,0xead54739,0x9dd277af,0x04db2615,0x73dc1683,
  164.     0xe3630b12,0x94643b84,0x0d6d6a3e,0x7a6a5aa8,0xe40ecf0b,0x9309ff9d,0x0a00ae27,0x7d079eb1,
  165.     0xf00f9344,0x8708a3d2,0x1e01f268,0x6906c2fe,0xf762575d,0x806567cb,0x196c3671,0x6e6b06e7,
  166.     0xfed41b76,0x89d32be0,0x10da7a5a,0x67dd4acc,0xf9b9df6f,0x8ebeeff9,0x17b7be43,0x60b08ed5,
  167.     0xd6d6a3e8,0xa1d1937e,0x38d8c2c4,0x4fdff252,0xd1bb67f1,0xa6bc5767,0x3fb506dd,0x48b2364b,
  168.     0xd80d2bda,0xaf0a1b4c,0x36034af6,0x41047a60,0xdf60efc3,0xa867df55,0x316e8eef,0x4669be79,
  169.     0xcb61b38c,0xbc66831a,0x256fd2a0,0x5268e236,0xcc0c7795,0xbb0b4703,0x220216b9,0x5505262f,
  170.     0xc5ba3bbe,0xb2bd0b28,0x2bb45a92,0x5cb36a04,0xc2d7ffa7,0xb5d0cf31,0x2cd99e8b,0x5bdeae1d,
  171.     0x9b64c2b0,0xec63f226,0x756aa39c,0x026d930a,0x9c0906a9,0xeb0e363f,0x72076785,0x05005713,
  172.     0x95bf4a82,0xe2b87a14,0x7bb12bae,0x0cb61b38,0x92d28e9b,0xe5d5be0d,0x7cdcefb7,0x0bdbdf21,
  173.     0x86d3d2d4,0xf1d4e242,0x68ddb3f8,0x1fda836e,0x81be16cd,0xf6b9265b,0x6fb077e1,0x18b74777,
  174.     0x88085ae6,0xff0f6a70,0x66063bca,0x11010b5c,0x8f659eff,0xf862ae69,0x616bffd3,0x166ccf45,
  175.     0xa00ae278,0xd70dd2ee,0x4e048354,0x3903b3c2,0xa7672661,0xd06016f7,0x4969474d,0x3e6e77db,
  176.     0xaed16a4a,0xd9d65adc,0x40df0b66,0x37d83bf0,0xa9bcae53,0xdebb9ec5,0x47b2cf7f,0x30b5ffe9,
  177.     0xbdbdf21c,0xcabac28a,0x53b39330,0x24b4a3a6,0xbad03605,0xcdd70693,0x54de5729,0x23d967bf,
  178.     0xb3667a2e,0xc4614ab8,0x5d681b02,0x2a6f2b94,0xb40bbe37,0xc30c8ea1,0x5a05df1b,0x2d02ef8d
  179. };
  180.  
  181. #if defined(FIONREAD)
  182. /*
  183.  *  Return non 0 iff something to read from io descriptor f
  184.  */
  185. rdchk(f)
  186. {
  187.     static long lf;
  188.  
  189.     ioctl(f,FIONREAD,&lf);
  190.     return((int) lf);
  191. }
  192. #endif
  193.  
  194. #if defined(SV)
  195. #include <fcntl.h>
  196.  
  197. char checked = '\0' ;
  198. /*
  199.  * Nonblocking I/O is a bit different in System V,Release 2
  200.  */
  201. rdchk(f)
  202. {
  203.     int lf,savestat;
  204.  
  205.     savestat = fcntl(f,F_GETFL) ;
  206.     fcntl(f,F_SETFL,savestat | O_NDELAY) ;
  207.     lf = read(f,&checked,1) ;
  208.     fcntl(f,F_SETFL,savestat) ;
  209.     return(lf) ;
  210. }
  211. #endif
  212.  
  213.  
  214. static unsigned
  215. getspeed(code)
  216. {
  217.     register n;
  218.  
  219.     for(n=0; speeds[n].baudr; ++n)
  220.         if(speeds[n].speedcode == code)
  221.             return(speeds[n].baudr);
  222.     return(38400);    /* Assume fifo if ioctl failed */
  223. }
  224.  
  225.  
  226.  
  227. #if defined(ICANON)
  228. struct termio oldtty,tty;
  229. #else
  230. struct sgttyb oldtty,tty;
  231. struct tchars oldtch,tch;
  232. #endif
  233.  
  234. extern int iofd;        /* File descriptor for ioctls & reads */
  235.  
  236. /*
  237.  * mode(n)
  238.  *  0: restore original tty mode
  239.  *  1: save old tty stat, set raw mode 
  240.  *  2: set XON/XOFF for sb/sz with ZMODEM or YMODEM-g
  241.  *  3: save old tty stat, set raw mode with flow control
  242.  *  4: no mode change - just wait for output to drain
  243.  */
  244. mode(new_mode)
  245. {
  246.     static did0 = FALSE;
  247.     if(new_mode != 4)
  248.         report_mode(new_mode);
  249.     switch(new_mode)
  250.     {
  251. #if defined(M_SYS5)
  252.     case 2:        /* Un-raw mode used by sz,sb when -g detected */
  253.         if(!did0)
  254.             (void) ioctl(iofd,TCGETA,&oldtty);
  255.         tty = oldtty;
  256.         tty.c_iflag &= ~(IXON | IXOFF | IXANY);
  257.  
  258. #if defined(RTSFLOW)
  259.         if(tty.c_cflag & (RTSFLOW | CTSFLOW))
  260.             tty.c_iflag = BRKINT;
  261.         else
  262.             tty.c_iflag = BRKINT|IXON;
  263. #else
  264.         tty.c_iflag = BRKINT|IXON;
  265. #endif
  266.  
  267.         tty.c_oflag = 0;    /* Transparent output */
  268.  
  269.         tty.c_cflag &= ~PARENB;    /* Disable parity */
  270.         tty.c_cflag |= CS8;    /* Set character size = 8 */
  271.         if(Twostop)
  272.             tty.c_cflag |= CSTOPB;    /* Set two stop bits */
  273.  
  274.  
  275. #if defined(READCHECK)
  276.         tty.c_lflag = Zmodem ? 0 : ISIG;
  277.         tty.c_cc[VINTR] = Zmodem ? -1:030;    /* Interrupt char */
  278. #else
  279.         tty.c_lflag = ISIG;
  280.         tty.c_cc[VINTR] = Zmodem ? 03:030;    /* Interrupt char */
  281. #endif
  282.         tty.c_cc[VQUIT] = -1;            /* Quit char */
  283. #if defined(NFGVMIN)
  284.         tty.c_cc[VMIN] = 1;
  285. #else
  286.         tty.c_cc[VMIN] = 3;     /* This many chars satisfies reads */
  287. #endif
  288.         tty.c_cc[VTIME] = 1;    /* or in this many tenths of seconds */
  289.  
  290.         (void) ioctl(iofd,TCSETAW,&tty);
  291.         did0 = TRUE;
  292.         return(OK);
  293.     case 1:
  294.     case 3:
  295.         if(!did0)
  296.             (void) ioctl(iofd,TCGETA,&oldtty);
  297.         tty = oldtty;
  298.         tty.c_iflag &= ~(IXON | IXOFF | IXANY);
  299.  
  300. #if defined(RTSFLOW)
  301.         tty.c_iflag = new_mode == 3 ? (IGNBRK | RTSFLOW) : IGNBRK;
  302. #else
  303.         tty.c_iflag = new_mode == 3 ? (IGNBRK | IXOFF) : IGNBRK;
  304. #endif
  305.  
  306.         /* No echo,crlf mapping,INTR,QUIT,delays,no erase/kill */
  307.         tty.c_lflag &= ~(ECHO | ICANON | ISIG);
  308.  
  309.         tty.c_oflag = 0;    /* Transparent output */
  310.  
  311.         tty.c_cflag &= ~PARENB;    /* Same baud rate,disable parity */
  312.         tty.c_cflag |= CS8;    /* Set character size = 8 */
  313.         if(Twostop)
  314.             tty.c_cflag |= CSTOPB;    /* Set two stop bits */
  315. #if defined(NFGVMIN)
  316.         tty.c_cc[VMIN] = 1; /* This many chars satisfies reads */
  317. #else
  318.         tty.c_cc[VMIN] = vmin_count; /* This many chars satisfies reads */
  319. #endif
  320.         tty.c_cc[VTIME] = 1;    /* or in this many tenths of seconds */
  321.         (void) ioctl(iofd,TCSETAW,&tty);
  322.         did0 = TRUE;
  323.         Baudrate = getspeed(tty.c_cflag & CBAUD);
  324.         report_comm_baud_rate(Baudrate);
  325.         return(OK);
  326.     case 4:
  327.         (void) ioctl(iofd,TCSETAW,&tty);
  328.         return(OK);
  329. #endif
  330. #if defined(V7)
  331.         /*
  332.      *  NOTE: this should transmit all 8 bits and at the same time
  333.      *   respond to XOFF/XON flow control.  If no FIONREAD or other
  334.      *   READCHECK alternative,also must respond to INTRRUPT char
  335.      *   This doesn't work with BSD4.  It should work with LLITOUT,
  336.      *   but LLITOUT was broken on the machine I tried it on.
  337.      */
  338.     case 2:        /* Un-raw mode used by sz,sb when -g detected */
  339.         if(!did0)
  340.         {
  341.             ioctl(iofd,TIOCEXCL,0);
  342.             ioctl(iofd,TIOCGETP,&oldtty);
  343.             ioctl(iofd,TIOCGETC,&oldtch);
  344. #if defined(LLITOUT)
  345.             ioctl(TIOCLGET,&Locmode);    /* Get "local mode" */
  346. #endif
  347.         }
  348.         tty = oldtty;
  349.         tch = oldtch;
  350. #if defined(READCHECK)
  351.         tch.t_intrc = Zmodem ? -1:030;    /* Interrupt char */
  352. #else
  353.         tch.t_intrc = Zmodem ? 03:030;    /* Interrupt char */
  354. #endif
  355.         tty.sg_flags |= (ODDP|EVENP|CBREAK);
  356.         tty.sg_flags &= ~(ALLDELAY|CRMOD|ECHO|LCASE);
  357.         ioctl(iofd,TIOCSETP,&tty);
  358.         ioctl(iofd,TIOCSETC,&tch);
  359. #if defined(LLITOUT)
  360.         ioctl(TIOCLBIS,&Locbit);
  361. #endif
  362. /* un-raw doesn't work w/o lit out *//*wht code was 99 */
  363.         cancel_transaction(0);
  364.         did0 = TRUE;
  365.         return(OK);
  366.     case 1:
  367.     case 3:
  368.         if(!did0)
  369.         {
  370.             ioctl(iofd,TIOCEXCL,0);
  371.             ioctl(iofd,TIOCGETP,&oldtty);
  372.             ioctl(iofd,TIOCGETC,&oldtch);
  373. #if defined(LLITOUT)
  374.             ioctl(TIOCLGET,&Locmode);    /* Get "local mode" */
  375. #endif
  376.         }
  377.         tty = oldtty;
  378.         tty.sg_flags |= RAW;
  379.         tty.sg_flags &= ~ECHO;
  380.         ioctl(iofd,TIOCSETP,&tty);
  381.         did0 = TRUE;
  382.         Baudrate = getspeed(tty.sg_ospeed);
  383.         report_comm_baud_rate(Baudrate);
  384.         return(OK);
  385.     case 4:
  386.         ioctl(iofd,TIOCSETP,&tty);
  387.         return(OK);
  388. #endif
  389.     case 0:
  390.         if(!did0)
  391.             return(ERROR);
  392. #if defined(M_SYS5)
  393.         (void) ioctl(iofd,TCSBRK,1);    /* Wait for output to drain */
  394.         (void) ioctl(iofd,TCFLSH,1);    /* Flush input queue */
  395.         (void) ioctl(iofd,TCSETAW,&oldtty);    /* Restore modes */
  396.         (void) ioctl(iofd,TCXONC,1);    /* Restart output */
  397. #endif
  398. #if defined(V7)
  399.         ioctl(iofd,TIOCSETP,&oldtty);
  400.         ioctl(iofd,TIOCSETC,&oldtch);
  401.         ioctl(iofd,TIOCNXCL,0);
  402. #if defined(LLITOUT)
  403.         ioctl(TIOCLSET,&Locmode);    /* Restore "local mode" */
  404. #endif
  405. #endif
  406.  
  407.         return(OK);
  408.     default:
  409.         return(ERROR);
  410.     }
  411. }
  412.  
  413. /*+-------------------------------------------------------------------------
  414.     sendbrk()
  415. --------------------------------------------------------------------------*/
  416. sendbrk()
  417. {
  418. #if defined(V7)
  419.     sleep(1);
  420.     ioctl(iofd,TIOCSBRK,0);
  421.     sleep(1);
  422.     ioctl(iofd,TIOCCBRK,0);
  423. #endif
  424. #if defined(M_SYS5)
  425.     ioctl(iofd,TCSBRK,0);
  426. #endif
  427. }    /* end of sendbrk */
  428.  
  429. /*+-------------------------------------------------------------------------
  430.     get_curr_dir(currdir,currdir_max)
  431. --------------------------------------------------------------------------*/
  432. void
  433. get_curr_dir(currdir,currdir_max)
  434. char *currdir;
  435. int currdir_max;
  436. {
  437. #if defined(V7)
  438.     getwd(currdir);
  439. #endif
  440.  
  441. #if defined(M_SYS5)
  442.     getcwd(currdir,currdir_max);
  443. #endif
  444.  
  445. }    /* end of get_curr_dir */
  446.  
  447. /*+-------------------------------------------------------------------------
  448.     zmputs(str) - send a string to the modem
  449.  
  450. processing for \336 (sleep 1 sec) and \335 (break signal)
  451. --------------------------------------------------------------------------*/
  452. zmputs(str)
  453. register char *str;
  454. {
  455. register char strch;
  456.  
  457.     while(strch = *str++)
  458.     {
  459.         switch(strch)
  460.         {
  461.         case '\336':
  462.             sleep(1);
  463.             continue;
  464.         case '\335':
  465.             sendbrk();
  466.             continue;
  467.         default:
  468.             sendline(strch);
  469.         }
  470.     }
  471. }    /* end of zmputs */
  472.  
  473. /*+-----------------------------------------------------------------------
  474.     get_home_dir(home_dir):  leave plenty of room for result!
  475. ------------------------------------------------------------------------*/
  476. get_home_dir(home_dir)
  477. char *home_dir;
  478. {
  479. static char home_directory[256] = "";
  480. struct passwd *pwent;
  481. struct passwd *getpwuid();
  482.  
  483.     if(home_directory[0])
  484.     {
  485.         strcpy(home_dir,home_directory);
  486.         return(0);
  487.     }
  488.  
  489.     if(!(pwent = getpwuid(getuid())))
  490.     {
  491.         perror("cannot get pwent for you!!");
  492.         exit(1);
  493.     }
  494.     strcpy(home_directory,pwent->pw_dir);
  495.     strcpy(home_dir,pwent->pw_dir);
  496.     endpwent();
  497.     return(0);
  498.  
  499. }    /* end of get_home_dir */
  500.  
  501. /* end of zcommon.c */
  502. /* vi: set tabstop=4 shiftwidth=4: */
  503.